﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using System.Web.DynamicData;
using Fatec.ControleEstoque.Attributes;
using Fatec.ControleEstoque.Data.Model;
using System.ComponentModel;
using System.Data.Objects;

namespace Fatec.ControleEstoque.Interface
{
    public partial class Edit_Pedidos : System.Web.UI.Page
    {
        protected MetaTable table;
        protected MetaTable table2;

        protected Pedidos tempPedidos;

        protected void Page_Init(object sender, EventArgs e)
        {
            DetailsDataSource.ContextType = typeof(EstoqueEntities);
            EntityDataSource1.ContextType = DetailsDataSource.ContextType;

            DynamicDataManager1.RegisterControl(DetailsView1);
            DynamicDataManager1.RegisterControl(DetailsView2);

            table = DetailsDataSource.GetTable();
            table2 = EntityDataSource1.GetTable();

            DetailsView1.RowsGenerator = new HideColumnFieldsManager(table, PageTemplate.Edit);
            DetailsView2.RowsGenerator = new HideColumnFieldsManager(table2, PageTemplate.Edit);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            table  = DetailsDataSource.GetTable();
            table2 = EntityDataSource1.GetTable();

            Title  = table.DisplayName;

            DetailsDataSource.Include = table.ForeignKeyColumnsNames;
            EntityDataSource1.Include = table2.ForeignKeyColumnsNames;
        }

        protected void DetailsView1_ItemCommand(object sender, DetailsViewCommandEventArgs e)
        {
            if (e.CommandName == DataControlCommands.CancelCommandName)
            {
                Response.Redirect(table.ListActionPath);
            }
        }

        protected void DetailsView1_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
        {
            if (e.Exception == null || e.ExceptionHandled)
            {
                Response.Redirect(table.ListActionPath);
            }
        }

        protected void LinkButtonInsert_Click(object sender, EventArgs e)
        {
            DetailsView2.ChangeMode(DetailsViewMode.Insert);

            DetailsView2.DataBind();
            UpdatePanel2.Update();
            ModalPopupExtender1.Show();
        }
        
        protected void LinkButtonSave_Click(object sender, EventArgs e)
        {
            if (IsValid){
                if (DetailsView2.CurrentMode == DetailsViewMode.Insert) {
                    DetailsView2.InsertItem(false);
                } else {
                    DetailsView2.UpdateItem(false);
                }
                DetailsView1.DataBind();
                ModalPopupExtender1.Hide();
            }
        }

        private void SetDeleteConfirmation(TableRow row)
        {
            foreach (Control c in row.Cells[0].Controls)
            {
                if (c is LinkButton)
                {
                    LinkButton btn = (LinkButton)c;
                    if (btn.CommandName == DataControlCommands.DeleteCommandName)
                    {
                        btn.OnClientClick = "return confirm('Você tem certeza que deseja excluir este item?');";
                    }
                }
            }
        }

        protected void EntityDataSource1_Inserting(object sender, EntityDataSourceChangingEventArgs e)
        {
            ((Pedido_Produtos)e.Entity).PedidosReference.EntityKey = ((Pedidos)Session["tempPedidos"]).EntityKey;
        }

        protected void DetailsView1_DataBound(object sender, EventArgs e)
        {
            ICustomTypeDescriptor descriptor = DetailsView1.DataItem as ICustomTypeDescriptor;

            if (descriptor != null && tempPedidos == null)
            {
                var prop = descriptor.GetProperties().Cast<PropertyDescriptor>().First();

                tempPedidos = (Pedidos)descriptor.GetPropertyOwner(prop);
                          
                Session["tempPedidos"] = tempPedidos;
            }
        }

        protected void DetailsDataSource_Updated(object sender, EntityDataSourceChangedEventArgs e)
        {
            if (Session["tempPedidos"] != null)
            {
                Session.Remove("tempPedidos");
            }
        }

        protected void LinkButtonCancelar_Click(object sender, EventArgs e)
        {
            Pedidos tempPedidos = (Pedidos)Session["tempPedidos"];
            EstoqueEntities context = new EstoqueEntities();
            Pedidos updPedidos = context.Pedidos.Where(p => p.Id == tempPedidos.Id).First();
            updPedidos.Status_Pedido = context.Status_Pedido.Where(p => p.Id.Equals("C")).First();
            context.ApplyPropertyChanges("Pedidos", updPedidos);
            
            context.SaveChanges();

            if (Session["tempPedidos"] != null)
            {
                Session.Remove("tempPedidos");
            }
            Response.Redirect(table.ListActionPath);            
        }

        protected void LinkButtonFinalizar_Click(object sender, EventArgs e)
        {
            Pedidos tempPedidos = (Pedidos)Session["tempPedidos"];
            EstoqueEntities context = new EstoqueEntities();
            Pedidos updPedidos = context.Pedidos.Where(p => p.Id == tempPedidos.Id).First();
            updPedidos.Status_Pedido = context.Status_Pedido.Where(p => p.Id.Equals("F")).First();
            context.ApplyPropertyChanges("Pedidos", updPedidos);
            
            

            System.Collections.Generic.List<Pedido_Produtos> itemPedido = context.Pedido_Produtos.Where(p => p.Pedidos.Id == updPedidos.Id).ToList();
            
            Tipo_Estoque tpEstoque = context.Tipo_Estoque.Where(p => p.Id.Equals(tempPedidos.Tipo_Pedido.Id)).First();

            foreach (Pedido_Produtos item in itemPedido)
            {
                var estoque = new Estoque();
                EntityKeyMember[] keyvalue = item.ProdutosReference.EntityKey.EntityKeyValues;
                int prodId = (int)keyvalue[0].Value;

                var produto = context.Produtos.Where(p => p.Id == prodId).First();
                estoque.Dt_Operacao = DateTime.Today;
                estoque.Pedido_Produtos = item;
                estoque.Produtos  = produto;
                estoque.Qtde = item.Qtde;
                estoque.Tipo_Estoque = tpEstoque;
                estoque.Valor_Total = item.Qtde * item.Valor;

                context.AddToEstoque(estoque);              
            }

            context.SaveChanges(); 
            
            if (Session["tempPedidos"] != null)
            {
                Session.Remove("tempPedidos");
            }
 

            Response.Redirect(table.ListActionPath); 
        }
    }
}
